package sys

import (
	"ginweb-admin/commons/base/api"
	"ginweb-admin/commons/response"
	"ginweb-admin/model/context"
	"ginweb-admin/model/entity/sys"
	"github.com/gin-gonic/gin"
	"github.com/gookit/validate"
	"strings"
)

type SysRoleMenuApi struct {
	api.BaseApi
}

// 保存角色对应的菜单
func (api *SysRoleMenuApi) SaveRoleMenu(c *gin.Context) {
	// 获取参数信息的载体
	sysRoleMenuContext := context.SysRoleMenuContext{}
	// 绑定参数
	err := c.ShouldBindJSON(&sysRoleMenuContext)
	if err != nil {
		response.FailWithError(err, c)
		return
	}

	// 参数校验
	validation := validate.Struct(sysRoleMenuContext)
	if !validation.Validate() {
		response.FailWithValidatorData(validation, c)
		return
	}

	// 把获取到的菜单进行分割
	menuIds := strings.Split(sysRoleMenuContext.MenuIds, ",")
	// 准备切片菜单容器
	sysRoleMenus := []*sys.SysRoleMenu{}
	// 遍历获取到菜单id
	for _, menuId := range menuIds {
		// 准备单个容器，用来存放单个菜单数据
		sysRoleMenu := sys.SysRoleMenu{}
		sysRoleMenu.RoleId = sysRoleMenuContext.RoleId
		sysRoleMenu.MenuId = api.StringToUnit(menuId)
		// 把单个数据容器存放到切片容器中
		sysRoleMenus = append(sysRoleMenus, &sysRoleMenu)
	}

	// 保存角色菜单的方法
	if err := sysRoleMenuService.SaveRoleMenus(sysRoleMenuContext.RoleId, sysRoleMenus); err != nil {
		response.FailWithMessage("创建失败！", c)
		return
	}
	// 如果保存成功，就返回创建创建成功
	response.Ok("创建成功", c)
}

// 查询角色对应的菜单
func (api SysRoleMenuApi) FindRoleMenu(c *gin.Context) {
	// 获取传递的角色ID
	roleIdStr := c.Query("roleId")
	// 字符串转换成uint
	roleId := api.StringToUnit(roleIdStr)
	if roleId == 0 {
		response.FailWithMessage("请选择一个角色进行操作！", c)
		return
	}
	// 调用查询的方法
	sysMenu, err := sysRoleMenuService.SelectRoleMenus(roleId)
	if err != nil {
		response.FailWithMessage("查询失败！", c)
		return
	}
	response.Ok(sysMenu, c)
}
